//
// Description: STL之lower_bound()与upper_bound()使用
//              在容器中寻找第一个大于等于或大于某个值的元素（单调不减容器）
//              在容器中寻找第一个小于等于或小于某个值的元素（单调不增容器）
// Created by Loading on 2021/4/4.
//

#include <bits/stdc++.h>

using namespace std;

int main() {
    vector<int> v1 = {1, 2, 3, 4, 5, 7};
    ///仅限于 已经从小到大排好序的数组
    //返回第一个 大于等于 5的值
    auto num1 = lower_bound(v1.begin(), v1.end(), 5);
    //返回第一个 大于 5的值
    auto num2 = upper_bound(v1.begin(), v1.end(), 5);
    cout << *num1 << " " << *num2 << endl;

    //返回第一个 大于等于 5的值的下标
    auto pos1 = lower_bound(v1.begin(), v1.end(), 5) - v1.begin();
    //返回第一个 大于 5的值的下标
    auto pos2 = upper_bound(v1.begin(), v1.end(), 5) - v1.begin();
    cout << pos1 << " " << pos2 << endl;

    //由大到小排序
    sort(v1.begin(), v1.end(), [](const int a, const int b){
       return a > b;
    });

    ///仅限于 已经由大到小排好序的数组
    //返回第一个 小于等于 5的值
    num1 = lower_bound(v1.begin(), v1.end(), 5, greater<>());
    //返回第一个 小于 5的值
    num2 = upper_bound(v1.begin(), v1.end(), 5, greater<>());
    cout << *num1 << " " << *num2 << endl;

    //返回第一个 小于等于 5的值的下标
    pos1 = lower_bound(v1.begin(), v1.end(), 5, greater<>()) - v1.begin();
    //返回第一个 小于 5的值的下标
    pos2 = upper_bound(v1.begin(), v1.end(), 5, greater<>()) - v1.begin();
    cout << pos1 << " " << pos2 << endl;
}